package com.chushouya.product.service.admin.impl;

import com.general.framework.core.lang.Beans;
import com.general.framework.core.lang.Check;
import com.general.framework.core.schema.PageResult;
import com.chushouya.product.dao.entity.SkuEvaluateItemEntity;
import com.chushouya.product.dao.repository.SkuEvaluateItemRepository;
import com.chushouya.product.dto.admin.skuevaluate.SkuEvaluateItemDetailDTO;
import com.chushouya.product.dto.admin.skuevaluate.SkuEvaluateItemListDTO;
import com.chushouya.product.dto.admin.skuevaluate.SkuEvaluateItemQuery;
import com.chushouya.product.dto.admin.skuevaluate.SkuEvaluateItemSaveDTO;
import com.chushouya.product.dto.admin.skuevaluate.SkuEvaluateItemUpdateDTO;
import com.chushouya.product.service.admin.SkuEvaluateItemService;
import com.chushouya.product.service.admin.TempEvaluateItemService;
import com.chushouya.product.service.admin.TempEvaluateItemValueService;
import com.chushouya.product.dao.entity.SkuEvaluateItemValueEntity;
import com.chushouya.product.dao.repository.SkuEvaluateItemValueRepository;
import com.chushouya.product.dto.admin.tempevaluate.TempEvaluateItemListDTO;
import com.chushouya.product.dto.admin.tempevaluate.TempEvaluateItemValueListDTO;
import com.general.framework.core.enums.StatusEnum;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;

/**
 * SKU估价项目业务实现
 */
@Service
public class SkuEvaluateItemServiceImpl implements SkuEvaluateItemService {

    @Resource
    private SkuEvaluateItemRepository skuEvaluateItemRepository;

    @Resource
    private SkuEvaluateItemValueRepository skuEvaluateItemValueRepository;

    @Resource
    private TempEvaluateItemService tempEvaluateItemService;

    @Resource
    private TempEvaluateItemValueService tempEvaluateItemValueService;

    @Override
    public PageResult<SkuEvaluateItemListDTO> selectSkuEvaluateItemPageResult(SkuEvaluateItemQuery query) {
        Check.notNull(query, "查询参数不能为空");
        
        PageResult<SkuEvaluateItemEntity> pageResult = skuEvaluateItemRepository.selectPageResult(query);
        return PageResult.of(pageResult, SkuEvaluateItemListDTO.class);
    }

    @Override
    public List<SkuEvaluateItemListDTO> selectSkuEvaluateItemList(SkuEvaluateItemQuery query) {
        Check.notNull(query, "查询参数不能为空");
        
        List<SkuEvaluateItemEntity> list = skuEvaluateItemRepository.selectList(query);
        return Beans.copyList(list, SkuEvaluateItemListDTO.class);
    }

    @Override
    public SkuEvaluateItemDetailDTO getSkuEvaluateItemDetail(Long skuItemId) {
        Check.notNull(skuItemId, "SKU估价项目ID不能为空");
        
        SkuEvaluateItemEntity entity = skuEvaluateItemRepository.selectByPrimaryKey(skuItemId);
        Check.notNull(entity, "SKU估价项目不存在");
        
        return Beans.copy(entity, SkuEvaluateItemDetailDTO.class);
    }
    @Override
    public Long addSkuEvaluateItem(SkuEvaluateItemSaveDTO skuEvaluateItem) {
        Check.notNull(skuEvaluateItem, "SKU估价项目信息不能为空");
        Check.notNull(skuEvaluateItem.getSkuId(), "SKU ID不能为空");
        Check.notNull(skuEvaluateItem.getItemId(), "估价项目ID不能为空");
        
        SkuEvaluateItemEntity entity = Beans.copy(skuEvaluateItem, SkuEvaluateItemEntity.class);
        entity.setCreateTime(new Date());
//        entity.setUpdateTime(new Date());
        
        skuEvaluateItemRepository.insertSelective(entity);
        return entity.getSkuItemId();
    }

    @Override
    public Long editSkuEvaluateItem(SkuEvaluateItemUpdateDTO skuEvaluateItem) {
        Check.notNull(skuEvaluateItem, "SKU估价项目信息不能为空");
        Check.notNull(skuEvaluateItem.getSkuItemId(), "SKU估价项目ID不能为空");
        
        SkuEvaluateItemEntity existEntity = skuEvaluateItemRepository.selectByPrimaryKey(skuEvaluateItem.getSkuItemId());
        Check.notNull(existEntity, "SKU估价项目不存在");
        
        SkuEvaluateItemEntity entity = Beans.copy(skuEvaluateItem, SkuEvaluateItemEntity.class);
//        entity.setUpdateTime(new Date());
        
        skuEvaluateItemRepository.updateByPrimaryKeySelective(entity);
        return entity.getSkuItemId();
    }

    @Override
    public void removeSkuEvaluateItem(Long skuItemId) {
        Check.notNull(skuItemId, "SKU估价项目ID不能为空");
        
        SkuEvaluateItemEntity existEntity = skuEvaluateItemRepository.selectByPrimaryKey(skuItemId);
        Check.notNull(existEntity, "SKU估价项目不存在");
        
        skuEvaluateItemRepository.deleteByPrimaryKey(skuItemId);
    }

    @Override
    public Long editSkuEvaluateItemStatus(Long skuItemId, Integer status) {
        Check.notNull(skuItemId, "SKU估价项目ID不能为空");
        Check.notNull(status, "状态不能为空");
        
        SkuEvaluateItemEntity existEntity = skuEvaluateItemRepository.selectByPrimaryKey(skuItemId);
        Check.notNull(existEntity, "SKU估价项目不存在");
        
        SkuEvaluateItemEntity entity = new SkuEvaluateItemEntity();
        entity.setSkuItemId(skuItemId);
        entity.setStatus(status);
//        entity.setUpdateTime(new Date());
        
        skuEvaluateItemRepository.updateByPrimaryKeySelective(entity);
        return skuItemId;
    }

    @Override
    public List<SkuEvaluateItemListDTO> selectSkuEvaluateItemListBySkuId(Long skuId) {
        Check.notNull(skuId, "SKU ID不能为空");
        
        SkuEvaluateItemQuery query = new SkuEvaluateItemQuery();
        query.setSkuId(skuId);
        
        List<SkuEvaluateItemEntity> list = skuEvaluateItemRepository.selectList(query);
        return Beans.copyList(list, SkuEvaluateItemListDTO.class);
    }

    @Override
    public List<SkuEvaluateItemListDTO> selectSkuEvaluateItemListByEvaluateItemId(Long evaluateItemId) {
        Check.notNull(evaluateItemId, "估价项目ID不能为空");
        
        SkuEvaluateItemQuery query = new SkuEvaluateItemQuery();
        query.setItemId(evaluateItemId);
        
        List<SkuEvaluateItemEntity> list = skuEvaluateItemRepository.selectList(query);
        return Beans.copyList(list, SkuEvaluateItemListDTO.class);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void importFromTemplate(Long productId, Long tempId) {
        Check.notNull(productId, "商品ID不能为空");
        Check.notNull(tempId, "模板ID不能为空");
        
        // 1. 查询模板下的所有估价项目
        List<TempEvaluateItemListDTO> tempItemList = tempEvaluateItemService.selectTempEvaluateItemListByTempId(tempId);
        if (tempItemList == null || tempItemList.isEmpty()) {
            return; // 模板下没有估价项目，直接返回
        }

        //根据productId 删除 skuEvaluateItem 和 skuEvaluateItemValue
        skuEvaluateItemValueRepository.deleteByProductId(productId);
        skuEvaluateItemRepository.deleteByProductId(productId);
        
        Date now = new Date();
        
        // 2. 遍历每个模板估价项目，复制到SKU估价项目
        for (TempEvaluateItemListDTO tempItem : tempItemList) {
            // 2.1 创建SKU估价项目
            SkuEvaluateItemEntity skuItem = new SkuEvaluateItemEntity();
            skuItem.setProductId(productId);
            skuItem.setItemId(tempItem.getItemId());
            skuItem.setItemName(tempItem.getItemName());
            skuItem.setSelectType(tempItem.getSelectType());
            skuItem.setSort(tempItem.getSort());
            skuItem.setStatus(StatusEnum.normal.value());
            skuItem.setCreateTime(now);
            
            // 插入SKU估价项目
            skuEvaluateItemRepository.insertSelective(skuItem);
            Long skuItemId = skuItem.getSkuItemId();
            
            // 2.2 查询该模板估价项目下的所有选项值
            List<TempEvaluateItemValueListDTO> tempValueList = tempEvaluateItemValueService.selectTempEvaluateItemValueListByTempItemId(tempItem.getTempItemId());
            
            if (tempValueList != null && !tempValueList.isEmpty()) {
                // 2.3 批量创建SKU估价项目选项值
                List<SkuEvaluateItemValueEntity> skuValueList = new ArrayList<>();
                
                for (TempEvaluateItemValueListDTO tempValue : tempValueList) {
                    SkuEvaluateItemValueEntity skuValue = new SkuEvaluateItemValueEntity();
                    skuValue.setProductId(productId);
                    skuValue.setSkuItemId(skuItemId);
                    skuValue.setItemId(tempItem.getItemId());
                    skuValue.setItemName(tempItem.getItemName());
                    skuValue.setValueId(tempValue.getValueId());
                    skuValue.setValueName(tempValue.getValueName());
                    skuValue.setValue(tempValue.getValue());
                    skuValue.setCalcType(tempValue.getCalcType());
                    skuValue.setSort(tempValue.getSort());
                    skuValue.setStatus(StatusEnum.normal.value());
                    skuValue.setCreateTime(now);
                    
                    skuValueList.add(skuValue);
                }
                
                // 批量插入SKU估价项目选项值
                if (!skuValueList.isEmpty()) {
                    skuEvaluateItemValueRepository.insertList(skuValueList);
                }
            }
        }
    }
}
